import pandas as pd
import numpy as np
from datetime import datetime

# 1. 从指定CSV文件读取数据（已知字段为date和predicted_export）
input_filename = 'academic_forecast_180days.csv'
try:
    # 读取文件，明确指定列名
    df = pd.read_csv(input_filename, parse_dates=['date'])

    # 检查必要的列是否存在
    required_columns = ['date', 'predicted_export']
    if not all(col in df.columns for col in required_columns):
        missing = [col for col in required_columns if col not in df.columns]
        raise ValueError(f"CSV文件缺少必要的列: {missing}")

    # 重命名列为中文，统一处理
    df = df.rename(columns={
        'date': '日期',
        'predicted_export': '预测出口量(辆)'  # 假设这是预测销量
    })

    # 按日期排序
    df = df.sort_values('日期').reset_index(drop=True)

    print(f"成功读取文件: {input_filename}")
    print(f"数据包含 {len(df)} 条记录")
    print(f"日期范围: 从 {df['日期'].min().strftime('%Y-%m-%d')} 到 {df['日期'].max().strftime('%Y-%m-%d')}")

except FileNotFoundError:
    print(f"错误: 未找到文件 {input_filename}")
    print("将生成模拟数据作为替代（包含date和predicted_export字段）")
    # 生成模拟数据，保持相同的字段结构
    start_date = datetime(2025, 4, 1)
    end_date = datetime(2025, 9, 30) + pd.DateOffset(days=90)  # 确保包含未来数据
    dates = pd.date_range(start=start_date, end=end_date)
    df = pd.DataFrame({
        '日期': dates,
        '预测出口量(辆)': np.random.randint(3000, 4800, size=len(dates))
    })

except Exception as e:
    print(f"读取文件时发生错误: {str(e)}")
    exit()

# 2. 按固定日期（2025-09-30）作为分割点，区分历史和未来数据
current_date = pd.to_datetime("2025-09-30")
print(f"\n使用固定日期作为分割点: {current_date.strftime('%Y-%m-%d')}")

# 标记历史数据和未来数据
df['数据类型'] = df['日期'].apply(
    lambda x: '历史数据' if x <= current_date else '未来数据'
)

# 统计数据量
historical_count = sum(df['日期'] <= current_date)
future_count = len(df) - historical_count
print(
    f"- 历史数据（{df['日期'].min().strftime('%Y-%m-%d')} 到 {current_date.strftime('%Y-%m-%d')}）：{historical_count} 条")
print(
    f"- 未来数据（{(current_date + pd.Timedelta(days=1)).strftime('%Y-%m-%d')} 到 {df['日期'].max().strftime('%Y-%m-%d')}）：{future_count} 条")

# 3. 为历史数据生成"实际销量"（基于预测值加合理波动）
# 2025-09-30及之前：生成实际销量
# 2025-10-01及之后：无实际销量（设为None）
df['实际销量(辆)'] = None

# 为历史数据生成实际销量（加±5%的随机波动）
historical_mask = df['日期'] <= current_date
historical_noise = np.random.normal(0, 0.05, size=sum(historical_mask))  # 5%的随机波动
df.loc[historical_mask, '实际销量(辆)'] = (
        df.loc[historical_mask, '预测出口量(辆)'] * (1 + historical_noise)
).round().astype(int)

# 未来数据实际销量保持为None（已默认设置）

# 4. 生成库存相关数据

# 产品属性参数（可根据实际情况调整）
单位采购成本 = 450.0  # 元/辆
单位持有成本 = 25.0  # 元/辆/天
单位缺货成本 = 120.0  # 元/辆
补货提前期 = 2  # 天
最大库存容量 = 15000  # 辆
安全库存 = 5000  # 辆

# 生成初始库存（安全库存的1.5倍）
初始库存 = 安全库存 * 1.5
库存水平 = [初始库存]

# 计算每日库存水平
for i in range(len(df)):
    # 确定当日需求量（历史用实际销量，未来用预测出口量）
    if df['日期'].iloc[i] <= current_date:
        当日需求 = df['实际销量(辆)'].iloc[i]
    else:
        当日需求 = df['预测出口量(辆)'].iloc[i]

    # 计算补货量（基于前一天的需求量）
    if i > 0:
        if df['日期'].iloc[i - 1] <= current_date:
            前一天需求 = df['实际销量(辆)'].iloc[i - 1]
        else:
            前一天需求 = df['预测出口量(辆)'].iloc[i - 1]
        补货量 = 前一天需求 * 0.9  # 补货量为前一天需求的90%
    else:
        补货量 = 当日需求 * 0.9  # 第一天的补货量

    # 确保补货后不超过最大库存容量
    最大可补货量 = 最大库存容量 - 库存水平[-1]
    补货量 = min(补货量, 最大可补货量)

    # 计算当日结束库存
    当日结束库存 = 库存水平[-1] + 补货量 - 当日需求

    # 处理缺货情况（库存不能为负）
    if 当日结束库存 < 0:
        缺货量 = -当日结束库存
        当日结束库存 = 0
    else:
        缺货量 = 0

    库存水平.append(当日结束库存)

    # 记录补货量和缺货量
    df.at[i, '补货量(辆)'] = round(补货量)
    df.at[i, '缺货量(辆)'] = round(缺货量)

# 移除初始库存，只保留每日结束库存
df['期末库存(辆)'] = [round(x) for x in 库存水平[1:]]

# 计算在途库存（基于补货提前期）
在途库存 = []
for i in range(len(df)):
    if i < 补货提前期:
        # 前几天的在途库存基于初始补货
        在途 = 初始库存 * 0.2 if i == 0 else 在途库存[i - 1] * 0.9
    else:
        # 后续在途库存基于补货提前期前的补货量
        在途 = df['补货量(辆)'][i - 补货提前期] * 0.8

    在途库存.append(round(在途))

df['在途库存(辆)'] = 在途库存

# 计算各项成本
df['持有成本(元)'] = df['期末库存(辆)'] * 单位持有成本
df['缺货成本(元)'] = df['缺货量(辆)'] * 单位缺货成本
df['补货成本(元)'] = df['补货量(辆)'] * 单位采购成本 + 500  # 500元固定手续费
df['每日总成本(元)'] = df['持有成本(元)'] + df['缺货成本(元)'] + df['补货成本(元)']

# 添加产品属性和库存规则参数
df['产品SKU'] = "婴儿车-001"
df['单位采购成本(元/辆)'] = 单位采购成本
df['单位持有成本(元/辆/天)'] = 单位持有成本
df['单位缺货成本(元/辆)'] = 单位缺货成本
df['补货提前期(天)'] = 补货提前期
df['最大库存容量(辆)'] = 最大库存容量
df['安全库存(辆)'] = 安全库存

# 格式化日期为字符串
df['日期'] = df['日期'].dt.strftime('%Y-%m-%d')

# 调整列的顺序，保留原始预测出口量字段
列顺序 = [
    '日期', '数据类型', '产品SKU', '实际销量(辆)', '预测出口量(辆)',
    '期末库存(辆)', '在途库存(辆)', '补货量(辆)', '缺货量(辆)',
    '持有成本(元)', '缺货成本(元)', '补货成本(元)', '每日总成本(元)',
    '单位采购成本(元/辆)', '单位持有成本(元/辆/天)', '单位缺货成本(元/辆)',
    '补货提前期(天)', '最大库存容量(辆)', '安全库存(辆)'
]
df = df[列顺序]

# 保存为CSV文件，使用中文标题
输出文件名 = '婴儿车库存管理完整数据.csv'
df.to_csv(输出文件名, index=False, encoding='utf-8-sig')

print(f"\n处理完成！生成的完整数据已保存为: {输出文件名}")
print(f"数据特点：")
print(f"- 2025-09-30及之前：包含实际销量和预测出口量（历史数据）")
print(f"- 2025-10-01及之后：仅包含预测出口量，无实际销量（未来数据）")
